
N = 19620; % 窗长度
% 生成窗函数序列
fc = 20000;
Fs = 48000;
fir_osr  = 128;

Kaiser_beta = 12.1;

rect_win      = rectwin(N+1);       % 矩形窗
hann_win      = hann(N+1);          % 汉宁窗
hamm_win      = hamming(N+1);       % 汉明窗
blackman_win  = blackman(N+1);      % 布莱克曼窗
kaiser_win    = kaiser(N+1,Kaiser_beta);

fir_box     = fir1(N, fc/(Fs*fir_osr/2), 'low', boxcar(N+1));
fir_rect    = fir1(N, fc/(Fs*fir_osr/2), 'low', rect_win);
fir_kaiser  = fir1(N, fc/(Fs*fir_osr/2), 'low', kaiser_win);
fir_box = fir_box * 2;

m_kaiser=20*log(abs(fft(fir_kaiser,N)))/log(10);
x_f=[0:(Fs/length(m_kaiser)):Fs/2];
m_kaiser=m_kaiser(1:length(x_f));
figure();
semilogx(x_f,m_kaiser);
xlabel('频率（Hz）','fontsize',8);
ylabel('幅度（dB）','fontsize',8);
freqz(fir_kaiser, 1, 2048, Fs*fir_osr);
title(['Kaiser窗低通FIR: ', num2str(fc/1000), 'kHz截止, N=', num2str(N)]);
% 绘制时域波形
% n = 0:N;
% figure;
% plot(n, fir_box, 'r', n, fir_rect, 'b', n, fir_kaiser, 'g');
% legend('矩形窗_box_fir', '矩形窗_rect_fir', '凯赛窗_fir');
% title('窗函数时域波形 (N=19260)');
% xlabel('采样点 n');
% ylabel('幅度');
% grid on;

% 绘制时域波形
n = 0:N;
figure;
plot(n, rect_win, 'r', n, hann_win, 'b', n, hamm_win, 'g', n, blackman_win, 'm',n,kaiser_win,'cyan');
legend('矩形窗', '汉宁窗', '汉明窗', '布莱克曼窗','凯赛窗β12.1');
title('窗函数时域波形 (N=64)');
xlabel('采样点 n');
ylabel('幅度');
grid on;
% freqz(fir_h, 1, 2048, Fs*osr);
%     title(['Kaiser窗低通FIR: ', num2str(fc/1000), 'kHz截止, N=', num2str(N)]);
function [generate_wave_44k,t_44k,fs_44k ] = generate_mixed_sine(duration_sec)
    % generate_mixed_sine - 生成多频率混合正弦波，最大幅度为1
    %
    % 参数:
    %   duration_sec - 信号总时长（秒）
    %
    % 返回:
    %   t            - 时间轴（单位秒）
    %   mixed_signal - 混合正弦波信号，幅值归一化至最大为1

    fs = 48000;  % 采样率：1 GHz

    freqs  = [1000 ];  % 混合频率
    amps   = [0.9];

    % ==== 时间轴 ====
    t = 0 : 1/fs : duration_sec;
    t_44k = t;
    fs_44k = fs;

    % ==== 合成信号 ====
    generate_wave_44k = zeros(size(t));
    for i = 1:length(freqs)
        generate_wave_44k = generate_wave_44k + amps(i) * cos(2 * pi * freqs(i) * t );
    end

    % ==== 幅值归一化 ====
    % mixed_signal = mixed_signal / max(abs(mixed_signal));

end